import axios from 'axios'
import router from "../router";

const request = axios.create({
    timeout: 50000,
    baseURL: "/api",
    // withCredentials: true // 确保携带Cookie和Session信息
})

// request 拦截器
// 可以自请求发送前对请求做一些处理
// 比如统一加token，对请求参数统一加密
request.interceptors.request.use(config => {
    config.headers['Content-Type'] = 'application/json;charset=utf-8';

    // 请求参数处理，防止 undefined 值被发送
    if (config.params) {
        Object.keys(config.params).forEach(key => {
            if (config.params[key] === undefined) {
                console.warn(`请求参数中存在 undefined 值: ${key}，已自动移除`);
                delete config.params[key];
            }
        });
    }
    
    // 处理 URL 中的路径参数
    if (config.url) {
        // 检测 URL 中是否包含 undefined 或 null
        if (config.url.includes('undefined') || config.url.includes('null')) {
            console.error('请求 URL 包含 undefined 或 null 值:', config.url);
            // 由于这是错误情况，返回一个被拒绝的 Promise
            return Promise.reject(new Error('请求 URL 包含 undefined 或 null 值'));
        }    }    
    
    // 定义不需要用户认证的接口
    const publicApis = ['/user/login', '/user/register'];
    const isPublicApi = publicApis.some(api => config.url.includes(api));
    
    if (!isPublicApi) {
        // 只对需要认证的接口进行用户检查
        let userJson = localStorage.getItem("user");
        
        if (userJson === null) {
            router.push("/login");
            return Promise.reject(new Error('用户未登录'));
        }
        
        let user = JSON.parse(userJson);
        if (user.userName == null || user.targetBook == null) {
            console.log("进入");
            console.log(user.userName, user.targetBook);
            router.push("/settings");
            return Promise.reject(new Error('用户信息不完整'));
        }
        
        // 统一在请求头中添加userID
        if (user && user.userID) {
            config.headers['X-User-ID'] = user.userID;
        }
    }
    
    return config
}, 
error => {
    console.error('请求拦截器错误:', error);
    return Promise.reject(error)
});

// response 拦截器
// 可以在接口响应后统一处理结果
request.interceptors.response.use(
    response => {
        let res = response.data;
        // 如果是返回的文件
        if (response.config.responseType === 'blob') {
            return res
        }
        // 兼容服务端返回的字符串数据
        if (typeof res === 'string') {
            res = res ? JSON.parse(res) : res
        }
        return res;
    },
    error => {
        // 增强错误日志，帮助调试
        if (error.response) {
            // 请求成功发出且服务器也响应了状态码，但状态代码超出了 2xx 的范围
            console.error('响应错误状态:', error.response.status);
            console.error('响应错误数据:', error.response.data);
            console.error('响应错误头:', error.response.headers);
        } else if (error.request) {
            // 请求已经成功发起，但没有收到响应
            console.error('请求无响应:', error.request);
            console.error('请求超时或网络错误');
        } else {
            // 发送请求时出了点问题
            console.error('请求配置错误:', error.message);
        }
        console.error('错误配置:', error.config);
        return Promise.reject(error)
    }
)

export default request
